#!/bin/bash

clear

	#fonction racine carre
	racine()
	{
		resultat=$(echo "sqrt($1)" | bc -l)
		#echo $resultat
		after_period=$(echo $resultat | cut -d"." -f2)
		before_period=$(echo $resultat | cut -d"." -f1)
		difference=$(echo "$resultat - $before_period" | bc -l)
		if [ "$difference" != "0" ]
		then
			resultat=$(echo "$before_period + 1" | bc -l)	
		else
			resultat=$before_period
		fi
		#	echo $resultat
	}

	#parametres calculs produits
	let "min=10000" #nombre d'elements minimum non nuls
	let "max=3000000" #nombre d'elements maximum non nuls
	let "pas=40000" #difference d'elts entre deux calculs
	let "fcompteur=10000" #nombre de fois que l'on va effectuer le produit matrice vecteur dans une fonction
	forme='carree' #forme de la matrice

	#premiere ligne de chaque fichier qui correspond aux étiquettes de chaque colonne
	echo "systeme;cpu_info;cpu_model;vitesse_cpu;GPU;flag_optimisation;langage;compilateur;stockage_matrice;forme;nombre_elt;dim1;dim2;type_matrice;temps_execution">>donnees2.csv
	
	#parametres systeme
	lspci | grep VGA
	if [ $? = 0 ] #on va tester si la commande marche sur le systeme
		then
		GPU=`lspci | grep VGA`
		else
		GPU = "No data on the GPU model" #si elle ne marche pas on le renseigne dans le tableau de donnees
	fi
	cpu_info=`grep -m1 'model name' /proc/cpuinfo |sed 's/[^:]*: //'`
	cpu_model=`grep -m1 'model' /proc/cpuinfo |sed 's/[^:]*: //'`
	vitesse_cpu=`fgrep "cpu MHz" /proc/cpuinfo | awk '{print $4}' | tail -1`

	
	#tableau de compilateur et de type
	declare -a compilateur=("gcc" "gfortran") #liste non exhaustive de compilateurs à utiliser
	declare -a type=("DINT" "DFLOAT")
	#on precise ensuite dans les makefile le compilateur utilisé pour les chaque langage
	sed -i "s/COMPILATEUR/${compilateur[0]}/g" langage_C/Makefile
	sed -i "s/COMPILATEUR/${compilateur[1]}/g" langage_F/Makefile
	
	let "k=0"
	while [ $k -lt 2 ]; do #boucle sur le type de matrice
		echo "Testing matrix type $k"
		#ensuite on precise quel type on veut utiliser pour les matrices et les vecteurs DINT=Entiers et DFLOAT=Reels
		sed -i "s/TYPE/${type[k]}/g" langage_C/Makefile
		sed -i "s/TYPE/${type[k]}/g" langage_F/Makefile
		
		#on utilise les flag d'optimisation (on modifie pour cela leurs valeurs dans le Makefile)
		let "fo = 0"
		while [ $fo -lt 4 ]; do #boucle flag d'optumisation
			echo "Testing optimisation flag $fo"	
			# on ecrit le bon flag d'optimisation directement dans les makefile
			sed -i "s/Op/O$fo/g" langage_C/Makefile
			sed -i "s/Op/O$fo/g" langage_F/Makefile
		
		
			#executons les makefile pour chaque langage
			sh remove_all_executables_and_o_files.sh 
			make -C langage_C
			make -C langage_F
			
			#executons pour chaque langage les differents produits matrice/vecteurs
			let "i = $max"
			
			while [ $i -ge $min ]; do #boucle d'execution
					
				let "nombre_elt = i" #nombre d elements non nuls de la matrice
				echo "Testing with $nombre_elt elements"
				racine $nombre_elt
				let "dim1 = resultat"
				let "dim2 = resultat"
				let "dim3 =i"
				n=`echo 3*$resultat/2 | bc `
				m=`echo 2*$resultat/3 | bc `
	echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";C;${compilateur[0]};dense_2D;carree;"$nombre_elt";"$dim1";"$dim2";"${type[k]}";"`langage_C/./main_dense_2D $dim1 $dim2 $fcompteur`>>donnees2.csv
				 echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";C;${compilateur[0]};dense_2D;longue;"$nombre_elt";"$n";"$m";"${type[k]}";"`langage_C/./main_dense_2D $n $m $fcompteur`>>donnees2.csv
				 echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";C;${compilateur[0]};dense_2D;large;"$nombre_elt";"$m";"$n";"${type[k]}";"`langage_C/./main_dense_2D $m $n $fcompteur`>>donnees2.csv
				 echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";C;${compilateur[0]};dense_1D;carree;"$nombre_elt";"$dim1";"$dim2";"${type[k]}";"`langage_C/./main_dense_1D $dim1 $dim2 $fcompteur`>>donnees2.csv
				 echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";C;${compilateur[0]};dense_1D;large;"$nombre_elt";"$m";"$n";"${type[k]}";"`langage_C/./main_dense_1D $m $n $fcompteur`>>donnees2.csv
				 echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";C;${compilateur[0]};dense_1D;longue;"$nombre_elt";"$n";"$m";"${type[k]}";"`langage_C/./main_dense_1D $n $m $fcompteur`>>donnees2.csv
				 echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";C;${compilateur[0]};creux_COO;carree;"$nombre_elt";"$dim3";"$dim3";"${type[k]}";"`langage_C/./main_COO $dim1 $fcompteur`>>donnees2.csv
				 echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";C;${compilateur[0]};creux_CSR;carree;"$nombre_elt";"$dim3";"$dim3";"${type[k]}";"`langage_C/./main_CSR $dim1 $fcompteur`>>donnees2.csv
				 echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";C;${compilateur[0]};creux_EI;carree;"$nombre_elt";"$dim3";"$dim3";"${type[k]}";"`langage_C/./main_EI $dim1 $fcompteur`>>donnees2.csv
				 echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";C;${compilateur[0]};creux_BND;carree;"$nombre_elt";"$dim3";"$dim3";"${type[k]}";"`langage_C/./main_BND $dim1 $fcompteur`>>donnees2.csv

				
				#pour le langage Fortran
				echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";fortran;${compilateur[1]};dense_2D;carree;"$nombre_elt";"$dim1";"$dim2";"${type[k]}";"`langage_F/./prog_dense_2D $dim1 $dim2 $fcompteur`>>donnees2.csv
				echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";fortran;${compilateur[1]};dense_2D;longue;"$nombre_elt";"$n";"$m";"${type[k]}";"`langage_F/./prog_dense_2D $n $m $fcompteur`>>donnees2.csv
				echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";fortran;${compilateur[1]};dense_2D;large;"$nombre_elt";"$m";"$n";"${type[k]}";"`langage_F/./prog_dense_2D $m $n $fcompteur`>>donnees2.csv
				echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";fortran;${compilateur[1]};dense_1D;carree;"$nombre_elt";"$dim1";"$dim2";"${type[k]}";"`langage_F/./prog_dense_1D $dim1 $dim2 $fcompteur`>>donnees2.csv
				echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";fortran;${compilateur[1]};dense_1D;large;"$nombre_elt";"$m";"$n";"${type[k]}";"`langage_F/./prog_dense_1D $m $n $fcompteur`>>donnees2.csv
				echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";fortran;${compilateur[1]};dense_1D;longue;"$nombre_elt";"$n";"$m";"${type[k]}";"`langage_F/./prog_dense_1D $n $m $fcompteur`>>donnees2.csv
				echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";fortran;${compilateur[1]};creux_COO;carree;"$nombre_elt";"$dim3";"$dim3";"${type[k]}";"`langage_F/./prog_COO $dim1 $fcompteur`>>donnees2.csv
				echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";fortran;${compilateur[1]};creux_CSR;carree;"$nombre_elt";"$dim3";"$dim3";"${type[k]}";"`langage_F/./prog_CSR $dim1 $fcompteur`>>donnees2.csv
				echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";fortran;${compilateur[1]};creux_EI;carree;"$nombre_elt";"$dim3";"$dim3";"${type[k]}";"`langage_F/./prog_EI $dim1 $fcompteur`>>donnees2.csv
				echo $MACHTYPE";"$cpu_info";"$cpu_model";"$vitesse_cpu";"$GPU";O"$fo";fortran;${compilateur[1]};creux_BND;carree;"$nombre_elt";"$dim3";"$dim3";"${type[k]}";"`langage_F/./prog_BND $dim1 $fcompteur`>>donnees2.csv			 
				 #pour le langage C

				
				#pour le langage Fortran
				
				let "i = i-pas"
				
			done #fin boucle execution
		

			#on va changer l'option du flag d'optimisation
			sed -i "s/O$fo/Op/g" langage_C/Makefile
			sed -i "s/O$fo/Op/g" langage_F/Makefile
			let "fo +=1"
		
		done #fin boucle sur les flags
		sed -i "s/${type[k]}/TYPE/g" langage_C/Makefile
		sed -i "s/${type[k]}/TYPE/g" langage_F/Makefile
	    let "k +=1"
	    
	
	done #fin boucle sur le type
	sed -i "s/${compilateur[1]}/COMPILATEUR/g" langage_F/Makefile
	sed -i "s/${compilateur[0]}/COMPILATEUR/g" langage_C/Makefile

# bash -x ./script.sh
